import pandas as pd
from pyecharts.charts import Line, Bar
from pyecharts import options as opts
from pyecharts.charts import Grid

# 数据文件地址
csv_file = r"data\数据.csv"  # 替换为你的文件路径

# 读取 CSV 文件，使用制表符分隔
df = pd.read_csv(csv_file, sep="\t")

# 确保列名无空格或乱码
df.columns = df.columns.str.strip()

# 统计作者数量（对作者列去重计数），以及按分类统计总粉丝量和总收藏数
category_stats = df.groupby("分类").agg(
    {"作者": "nunique", "真实粉丝数": "sum", "收藏数": "sum"}
).reset_index()

# 准备数据
categories = category_stats["分类"].tolist()
author_count = category_stats["作者"].tolist()
total_fans = category_stats["真实粉丝数"].tolist()
total_collections = category_stats["收藏数"].tolist()

# 创建柱状图表示作者数量
bar = (
    Bar()
    .add_xaxis(categories)
    .add_yaxis("作者数量", author_count, yaxis_index=0)
    .set_global_opts(
        yaxis_opts=opts.AxisOpts(name="作者数量", position="left"),  # 左侧轴用于作者数量
        xaxis_opts=opts.AxisOpts(name="分类", axislabel_opts={"rotate": 30}),
    )
)

# 创建折线图表示总粉丝量和总收藏数
line = (
    Line()
    .add_xaxis(categories)
    .add_yaxis("总粉丝量", total_fans, yaxis_index=1, is_smooth=True)
    .add_yaxis("总收藏数", total_collections, yaxis_index=1, is_smooth=True)
    .set_global_opts(
        yaxis_opts=opts.AxisOpts(
            name="数量", position="right", axislabel_opts={"formatter": "{value}"}
        ),  # 右侧轴用于总粉丝量和总收藏数
        tooltip_opts=opts.TooltipOpts(trigger="axis"),  # 鼠标悬停显示详细数据
        legend_opts=opts.LegendOpts(pos_top="5%"),
    )
)

# 将柱状图和折线图合并到同一张图
bar.overlap(line)

# 使用 Grid 调整布局
grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_right="5%", pos_left="10%"))
)

# 保存图表
output_file = r"python课程设计\课设代码\category_stats_combined_chart.html"
grid.render(output_file)
print(f"图表已保存为 {output_file}，打开即可查看。")
